查看原文
其他

写了这么多年代码,你真的了解设计模式么?| 洞见

王健 ThoughtWorks洞见 2020-02-27

昨天和同事聊到最近他要做的一个培训,大概的课程是这样的:

第一天:

  • 上午:面向对象原则(OO+SOLID )

  • 下午:设计模式(Design Pattern)

第二天:

  • 上午:简单设计(SimpleDesign)

  • 下午:重构到模式(Refactor to DesignPattern)

面向对象原则,设计模式,简单设计,重构到模式……看起来都是常规操作,但你有想过他们的关系么?

忍不住要山寨一段《写了这么多年代码,你真的了解SOLID吗?》中的发言:

上面提到的每一项大家都耳熟能详,但我发现大部分开发者并没有真正理解。要获得最大收益,就必须理解它们之间的关系,并综合应用所有这些原则。只有把它们作为一个整体,才可能构建出坚实(Solid)的软件。遗憾的是,我们看到的书籍和文章都在罗列每个原则,没有把它们作为一个整体来看,甚至提出这几项的知名大叔们也没能讲透彻。因此我尝试介绍一下我的理解。


面向对象原则(OO+SOLID )

偷懒一下,请大家移步,直接参考文章《写了这么多年代码,你真的了解SOLID吗?》,记得回来呦~

简单理解,面向对象原则给我们提供了一系列面向对象上下文下的最佳实践,指导原则和终极目标,符合这些原则可以帮助我们最大化OO的威力。

如果把面向对象类比成软件开发领域的一个武林门派,面向对象原则就是这个门派的最高心法和目标,打个比方,有点像:心与意合,意与气合,气与力合,肩与胯合,肘与膝合,手与足合……这种。

心法这种东西就是神神秘秘的,真正看起来也简单,字面上也不难理解,很容易用它来挑战别人:“你看你看,你没有做到手与足合!”

但是回到自己,要想做到就难了,知易行难!

归其原因它虽然提供了目标和评价标准,使我们很容易拿他来评价别人,但并没有告诉我们自己如何才能达到这样的目标和标准。


设计模式(Design Pattern)

那设计模式是什么?

很多人,包括我在内,都曾迷陷于23种设计模式之中,初识设计模式,赞叹于其精妙,就像个萌新的江湖小生,偶然间掉到个山洞,一下就集齐了威震江湖的“7种武器”。

然后……就开始了用长生剑切菜,用碧玉刀削瓜的“幸福生活”,不但把简单的事情搞得巨复杂,最不能忍的是还暴殄天物!

回到设计模式,无非是在面向对象原则这些虚无缥缈的“心法”指导原则下,那些前辈大神们留下的“招式”或是“套路”而已。但招式和套路并不能致胜,它只是为我们这等小白提供了一个接近大神,理解心法的途径而已,通过长年累月的模仿去反思去领悟去体会“心法”的本质和精妙,此时脑中不禁浮现《少林寺》中李连杰夏练三九冬练三伏的画面……

这就能解释为什么使用同样的招式,大神们总能一击致命,而我们却总是被按倒在地摩擦的原因了。


简单设计(SimpleDesign)

设计模式是套路和招式,那简单设计是什么?

首先要区分一下简单设计和容易设计:

简单的反义词是复杂,容易的反义词是困难。简单不等于容易,追求简单的过程往往很困难,如果只是追求容易的往往导致系统过于复杂。

这是好多年前一位同事提到过的一句话,很在点儿上,我们经常混淆了简单和容易,对于这点,另一位同事之前也写过一篇文章来阐述做到“简单”的“困难”。

做为结果的简单设计是这么一种设计,它能被几乎所有人理解, 但只有极少数人能做出. 或者反过来说也可以. 简单设计是一种只有极少数人能做出的设计,但设计一旦做出后,能被所有人理解。

可见简单设计是一种只有极少数人能做出的设计,那我们怎么才能成为那“极少数人“呢?

对此,Kent Beck给出了清晰的答案:

  1. 通过所有测试(Passes its tests)

  2. 尽可能消除重复 (Minimizes duplication)

  3. 尽可能清晰表达 (Maximizes clarity)

  4. 更少代码元素 (Has fewer elements)

  5. 以上四个原则的重要程度依次降低。

这组定义被称做简单设计原则。

我们不具体探讨这几个原则,回到最初的问题,如果说面向对象原则是”心法“是”目标“,设计模式是前辈们沉淀下来的”套路”和“招式“的话,那简单设计是什么呢?

我觉得就是实战指导原则,他可以让我们不局限于哪些经典的过往的招式,跳出套路,无招胜有招。

如果说设计模式是一种自上而下,通过不断模仿前辈大神套路达到目标的一条道路的话(有招胜无招);那简单设计原则则是另一条自下而上,忘掉招式和套路,遵循简单的基本原则,随机应变,不断演进,不断浮现,逐步逼近目标的另一条道路(无招胜有招)。

但,记住,殊途同归。

好,这位客官问了,那两条道路都可以帮我们掌握武功最高的心法的目标,我走哪条呢?如果我已经会了一条,还需要学习另一条路径么?

请移步我的《筷子定理》


重构到模式(Refactor to DesignPattern)

说到这里,就不难理解“重构到模式”到底在说什么了吧。

它无非是在解释如何通过自下而上应用简单设计原则,运用重构的技术和手法,浮现出设计模式。我管这个过程叫“重走长征路”,重新体验一下那些大神前辈们创建发现设计模式的过程。

这个过程也再次证明了这两条通往同一个目标的不同的道路也是可以相互转换的,它们只不过是面向对象原则下的两种不同形式的表现而已。

如果说“设计模式”是“有招胜无招”,“简单设计”是“无招胜有招”的话,那“重构到模式”就是“无招生有招”的过程。


总结

总的来说,我们可以把这几个概念作为一个整体框架来思考。

“面向对象原则”是OO领域的终极目标,是面向对象这门武功的心法,很容易用来评判别人,但是自己却很难达到。

为了能达到心法的境界,之前的各任掌门大神们总结并留下了一些套路和招式,什么降龙十八掌之类的,让我等晚辈可以通过日复一日的刻意练习,去不断参透心法的真谛,这些套路和招式就是“设计模式”。

但只有这十八招显然是不够的,于是我们又学到了一些实战指导原则,让我们以另一种方式,自下而上,跳出招式和套路的限制,甚至能不断浮现出新的招式,且通向的是同一个目标,这些实战指导原则就是“简单设计原则”。

最后,不断操练“重构到模式”,通过实际运用实战指导原则和手法,推演招式和套路,帮助我们将这两种方法融会贯通,相互结合,最终领悟那隐藏在一切表象背后的真理,达到无招胜有招,草木竹石皆可为剑,心随意走,人随心动的境界。


- 相关阅读 -

写了这么多年代码,你真的了解SOLID吗?

识别领域事件

点击【阅读原文】可至洞见网站查看原文&绿色字体部分的相关链接。

本文版权属ThoughtWorks公司所有,如需转载请在后台留言联系。

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存